<?php
class Output extends MY_Controller {

	// Modelos usados en las funciones del controlador
	var $modelOutputDAO = 'Output_dao';
	var $modelOutputDTO = 'Output_dto';

	var $modelIndicatorDAO = 'Indicator_dao';

	var $modelOutcomeDAO = 'Outcome_dao';
	var $modelOutcomeDTO = 'Outcome_dto';
	
	// Vistas utilizadas en las funciones del controlador
	var $editionView = 'output/output_new_view';
	var $gridView = 'output/output_all_view';
	var $resultMessageView = '';
	
	// Vista a la que debe redirigirse al guardar/borrar una output
	var $redirectMethod = 'information/getAll';
	
	// Datos para pasar a las vistas
	var $pageTitle = '';
	
	private $controllerName = 'output';
	
	public function __construct()
    {
    	parent::__construct();
		
		// Éstos modelos los cargo al inicio ya que los utilizo en la mayoría de los métodos
		$this->load->model("$this->modelOutputDAO", 'Output_dao');
		$this->load->model("$this->modelOutputDTO", 'Output_dto');
		
		$this->resultMessageView = $this->template->getResultMessageView();
	}
	
	private function _loadOutcomeModels()
	{
		$this->load->model("$this->modelOutcomeDAO", 'Outcome_dao');
		$this->load->model("$this->modelOutcomeDTO", 'Outcome_dto');
	}
	
	private function _getAll($idOutcome = 0)
	{	
		$this->pageTitle = 'All Outputs';
		
		if ($idOutcome == 0) { $condiciones = array(); }
		else { $condiciones = array('idOutcome' => $idOutcome); }
		
		// Obtengo la lista de todos los output segun el Outcome seleccionado
		$dataView['outputs'] = $this->Output_dao->obtenerObjetos($condiciones);
		
		parent::_loadViews($this->gridView, $dataView);
	}
	
	public function addOutput($idOutcome = 0)
	{
		$this->pageTitle = 'New Output';
		$this->_loadEditionForm(0, $idOutcome, 'addOutput');
	}
	
	public function editOutput($idOutput, $idOutcome)
	{
		$this->pageTitle = 'Edit Output';
		$this->_loadEditionForm($idOutput, $idOutcome, 'editOutput');
	}
	
	private function _loadEditionForm($idOutput = 0, $idOutcome = 0, $function, $cargar_completo = FALSE, $isModal = TRUE)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, $function)) {
			// Variables utilizadas en la vista para filtrar la información mostrada. Defino valores por defecto
			$dataView['idOutcome'] = $idOutcome;
			$dataView['idBusinessLine'] = 0;
			
			// Cargo las librerías y modelos que voy a utilizar
			$this->_loadOutcomeModels();
			
			// Para la carga de las salidas, debo obtener los resultados a los que puede asociarse
			if($idOutcome != 0) {
				$outc = $this->Outcome_dao->obtenerObjetoPorID($idOutcome);
				$dataView['idBusinessLine'] = $outc->idBusinessLine;
				$outcomes = array($outc);
			}
			else $outcomes = $this->Outcome_dao->obtenerDatos();
			$dataView['outcomes'] = $outcomes;
			
			// Obtengo la salida que se desea modificar y mostrar en la vista
			$dataView['output'] = $this->Output_dao->obtenerObjetoPorID($idOutput);
			$dataView['isModal'] = $isModal;

			if(!$cargar_completo) $this->load->view($this->editionView, $dataView);
			else parent::_loadViews($this->editionView, $dataView);
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	public function saveOutput($idBusinessLine = 0, $idOutcome = 0)
	{	
		$this->pageTitle = 'Save Output';
	
		// Se agregan las validaciones a los campos que corresponde
		$this->form_validation->set_rules('nameOP','Output Name','trim|required|max_length[250]|xss_clean');
		$this->form_validation->set_rules('outcome_op','Outcome','trim|required');
		
		$id = is_numeric($this->input->post('idOP')) ? $this->input->post('idOP') : 0;
        if ($this->form_validation->run() == FALSE)
        {
			// Alguno de los campos no pasó la validación anterior, vuelvo a mostrar el fomulario de edición	
			$this->_loadEditionForm($id, $idOutcome, 'addOutput', TRUE, FALSE);
        }else{ // La validación del formulario fue exitosa, puedo continuar y guardar los datos
			
			if($this->nombreDisponible($this->input->post('nameOP'), $this->input->post('outcome_op'))) {
				// Obtengo los datos desde el formulario y los asigno al modelo
				if($id == 0) {
					$output = new Output_dto();
					$output->id = 0;
				}
				else $output = $this->Output_dao->obtenerObjetoPorID($id);
				
				$output->name = $this->input->post('nameOP');
				$output->idOutcome = $this->input->post('outcome_op');

				$result = $this->Output_dao->guardar($output);
				
				// Valido si ocurrió algún error al intentar guardar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') { // Si no hubo error y se guardó la nueva línea, continúo
					redirect($this->redirectMethod . '/' . $idBusinessLine . '/' . $idOutcome);
				}
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$this->form_validation->set_message('nameOP', 'This Output name already exists');
				$this->_loadEditionForm($id, $idOutcome, 'addOutput', TRUE, FALSE);
			}
        }
	}
	
	public function deleteOutput($idOutput, $idBusinessLine = 0, $idOutcome = 0)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, 'deleteOutput')) {
			$this->pageTitle = 'Delete Output';
			
			if($this->validarEliminacion($idOutput)) {
				$result = $this->Output_dao->borrar($idOutput);
					
				// Valido si ocurrió algún error al intentar borrar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') redirect($this->redirectMethod . '/' . $idBusinessLine . '/' . $idOutcome);
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$dataView['result'] = 'Can not delete an Output with associated Indicators.';
				parent::_loadViews("$this->resultMessageView", $dataView);
			}
		}
		else {
			parent::loadForbiddenView();
		}
	}

	public function permittedDelete()
	{
		$idOP = $this->input->post('item');
		
		if(!$idOP) echo FALSE;
        else {
        	if($this->validarEliminacion($idOP)) echo TRUE;
        	else echo FALSE;
        }
	}

	private function validarEliminacion($idOP)
	{
    	$this->load->model($this->modelIndicatorDAO);

    	// Compruebo si la Output tiene indicadores asociados
		$condiciones = array('idOutput' => $idOP);
		$consulta = $this->Indicator_dao->obtenerObjetos($condiciones);
		if (sizeof($consulta) == 0) {
			 return TRUE;
		}
		else return FALSE;
	}

	public function existName()
	{
		$name = $this->input->post('item');
		$idParent = $this->input->post('idParent');
		
		if(!$name) echo FALSE;
        else {
			if(!$this->nombreDisponible($name, $idParent)) echo TRUE;
			else echo FALSE;
        }
	}

	public function nombreDisponible($name, $idParent)
	{
		$name = trim($name);
		$condiciones = array('name' => "$name",
							 'idOutcome' => $idParent);
		
		$consulta = $this->Output_dao->obtenerDatos($condiciones);
		if (sizeof($consulta) > 0) {
			 return FALSE; // El nombre no es válido porque ya hay otro con ese nombre
		}
		else return TRUE;
	}
}